package com.wtb.javatool.dao;

import com.wtb.javatool.dto.TaskDto;
import com.wtb.javatool.entity.Task;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

@Mapper
public interface TaskMapper {


    Long createTask(Task task);


    /**
     * 根据项目ID、任务名称（可选）、任务类型（可选）、所属课程ID（可选）查询项目所有相关任务
     *
     * @param projectId 项目ID
     * @param taskName  任务名称，用于筛选查询结果。如果为空或null，则不进行筛选。
     * @param taskType  任务类型，用于筛选查询结果。如果为空或null，则不进行筛选。
     * @param courseId  所属课程ID，用于筛选查询结果。如果为空或null，则不进行筛选。
     * @param begin     分页参数，表示查询结果的起始位置（从0开始）。
     * @param size      分页参数，表示每页返回的结果数量。
     * @return 任务列表
     */
    List<TaskDto> findTasksByProjectId(@Param("projectId") Long projectId,
                                       @Param("taskName") String taskName,
                                       @Param("taskType") Integer taskType,
                                       @Param("courseId") Long courseId,
                                       @Param("creatorId") Long creatorId,
                                       @Param("begin") Integer begin,
                                       @Param("size") Integer size
    );

    /**
     * 根据项目ID计算满足条件的任务数量。
     *
     * @param projectId 项目ID
     * @return 返回一个整数，表示满足条件的项目ID的数量。
     */
    int countTasksByProjectId(@Param("projectId") Long projectId,
                              @Param("taskName") String taskName,
                              @Param("taskType") Integer taskType,
                              @Param("courseId") Long courseId,
                              @Param("creatorId") Long creatorId);

    List<Long> findMyTasksIdByProjectIdAndUserId(@Param("projectId") Long projectId,
                                                 @Param("taskName") String taskName,
                                                 @Param("taskType") Integer taskType,
                                                 @Param("courseId") Long courseId,
                                                 @Param("userId") Long userId,
                                                 @Param("begin") Integer begin,
                                                 @Param("size") Integer size
    );

    int countMyTasksIdByProjectIdAndUserId(@Param("projectId") Long projectId,
                                           @Param("taskName") String taskName,
                                           @Param("taskType") Integer taskType,
                                           @Param("courseId") Long courseId,
                                           @Param("userId") Long userId);

    List<TaskDto> findMyTasksByTaskIds(@Param("list") List<Long> taskIds);

    /**
     * 根据项目ID、查询项目所有相关任务ID
     *
     * @param projectId 项目ID
     * @return 任务ID列表
     */
    List<Long> findTasksIdByProjectId(@Param("projectId") Long projectId);


    /**
     * 根据任务ID获取普通项目的任务详情信息
     *
     * @param taskId 任务ID
     * @return 返回一个携带任务基本信息的任务DTO实体类
     */
    TaskDto findNormalTaskByTaskId(@Param("taskId") Long taskId);

    /**
     * 根据任务ID获取课程项目的任务详情信息
     *
     * @param taskId 任务ID
     * @return 返回一个携带任务基本信息的任务DTO实体类
     */
    TaskDto findTeachingTaskByTaskId(@Param("taskId") Long taskId);

    /**
     * 跟新任务名称
     *
     * @param task 任务实体，携带新的任务名称
     */
    void updateTaskName(Task task);

    /**
     * 跟新任务描述
     *
     * @param task 任务实体，携带新的任务描述
     */
    void updateTaskDescription(Task task);

    /**
     * 跟新任务类型
     *
     * @param task 任务实体，携带新的任务类型
     */
    void updateTaskType(Task task);

    /**
     * 跟新任务所属课程
     *
     * @param task 任务实体，携带新的所属课程
     */
    void updateTaskCourse(Task task);

    /**
     * 根据课程id,查询该课程拥有的全部任务的任务id
     *
     * @param courseId 课程id
     * @return 任务id列表
     */
    List<Long> findTaskIdsByCourseId(@Param("courseId")Long courseId);

    /**
     * 根据任务ID删除任务
     *
     * @param taskId 任务ID
     * @return 影响的行数
     */
    int deleteById(Long taskId);
}
